package com.sky.skyopsserver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sky.skyopsserver.domain.Application;
import com.sky.skyopsserver.vos.*;

import java.util.List;

/**
 * 应用信息服务接口
 * 
 * @author Administrator
 * @description 针对表【application(应用信息表)】的数据库操作Service
 * @createDate 2025-09-13 17:43:04
 */
public interface ApplicationService extends IService<Application> {

    /**
     * 添加应用
     * 
     * @param reqVO 添加应用请求VO
     * @return 应用ID
     */
    Long addApplication(ApplicationAddReqVO reqVO);

    /**
     * 更新应用信息
     * 
     * @param reqVO 更新应用请求VO
     * @return 是否更新成功
     */
    Boolean updateApplication(ApplicationUpdateReqVO reqVO);

    /**
     * 根据ID删除应用
     * 
     * @param id 应用ID
     * @return 是否删除成功
     */
    Boolean deleteApplication(Long id);

    /**
     * 批量删除应用
     * 
     * @param ids 应用ID列表
     * @return 是否删除成功
     */
    Boolean batchDeleteApplication(List<Long> ids);

    /**
     * 根据ID查询应用详情
     * 
     * @param id 应用ID
     * @return 应用详情
     */
    ApplicationRspVO getApplicationById(Long id);

    /**
     * 根据编码查询应用
     * 
     * @param code 应用编码
     * @return 应用信息
     */
    ApplicationRspVO getApplicationByCode(String code);

    /**
     * 分页查询应用列表
     * 
     * @param reqVO 分页查询请求VO
     * @return 分页结果
     */
    IPage<ApplicationRspVO> getApplicationPage(ApplicationPageReqVO reqVO);

    /**
     * 查询所有应用选项（用于下拉选择）
     * 
     * @return 应用选项列表
     */
    List<ApplicationOptionRspVO> getAllApplicationOptions();

    /**
     * 根据项目ID查询应用选项
     * 
     * @param projectId 项目ID
     * @return 应用选项列表
     */
    List<ApplicationOptionRspVO> getApplicationOptionsByProjectId(Long projectId);

    /**
     * 获取应用统计信息
     * 
     * @return 应用统计信息
     */
    ApplicationStatisticsRspVO getApplicationStatistics();

    /**
     * 检查应用编码是否已存在
     * 
     * @param code 应用编码
     * @param excludeId 排除的应用ID（可选）
     * @return 是否存在
     */
    Boolean checkApplicationCodeExists(String code, Long excludeId);

    /**
     * 检查应用名称是否已存在
     * 
     * @param name 应用名称
     * @param excludeId 排除的应用ID（可选）
     * @return 是否存在
     */
    Boolean checkApplicationNameExists(String name, Long excludeId);

    /**
     * 根据名称模糊查询应用
     * 
     * @param name 应用名称关键字
     * @return 应用列表
     */
    List<ApplicationRspVO> searchApplicationByName(String name);

    /**
     * 根据编码模糊查询应用
     * 
     * @param code 应用编码关键字
     * @return 应用列表
     */
    List<ApplicationRspVO> searchApplicationByCode(String code);

    /**
     * 验证应用编码格式
     * 
     * @param code 应用编码
     * @return 是否有效
     */
    Boolean validateApplicationCode(String code);

    /**
     * 获取所有应用编码列表
     * 
     * @return 应用编码列表
     */
    List<String> getAllApplicationCodes();

    /**
     * 获取所有应用名称列表
     * 
     * @return 应用名称列表
     */
    List<String> getAllApplicationNames();

    /**
     * 根据项目ID获取应用数量
     * 
     * @param projectId 项目ID
     * @return 应用数量
     */
    Long getApplicationCountByProjectId(Long projectId);

    /**
     * 移动应用到指定项目
     * 
     * @param applicationIds 应用ID列表
     * @param targetProjectId 目标项目ID
     * @return 是否移动成功
     */
    Boolean moveApplicationsToProject(List<Long> applicationIds, Long targetProjectId);

    /**
     * 复制应用到指定项目
     * 
     * @param applicationId 应用ID
     * @param targetProjectId 目标项目ID
     * @param newCode 新应用编码
     * @param newName 新应用名称
     * @return 新应用ID
     */
    Long copyApplicationToProject(Long applicationId, Long targetProjectId, String newCode, String newName);

    /**
     * 获取项目下的应用列表
     * 
     * @param projectId 项目ID
     * @return 应用列表
     */
    List<ApplicationRspVO> getApplicationsByProjectId(Long projectId);

    /**
     * 获取空项目列表（没有应用的项目）
     * 
     * @return 项目ID列表
     */
    List<Long> getEmptyProjectIds();

    /**
     * 获取有应用的项目列表
     * 
     * @return 项目ID列表
     */
    List<Long> getProjectIdsWithApplications();
}
